package com.edu.mybatis.mappers;

import com.edu.mybatis.pojo.Employee;
import org.apache.ibatis.annotations.Param;

/**
 * 一、MyBatis的一级缓存
 * 一级缓存是SqlSession级别的，通过同一个SqlSession查询数据会被缓存，
 * 下次查询相同的数据，就会从缓存中直接获取，不会重新访问数据库。
 * 使一级缓存失效的四种情况：
 * 1.不同的SqlSession对应不同的一级缓存
 * 2.同一个SqlSession但是查询条件不同
 * 3.同一个SqlSession两次查询期间执行了任意一次增删改操作
 * 4.同一个SqlSession两次查询期间手动清空了缓存
 * 二、MyBatis的二级缓存
 * 二级缓存是SqlSessionFactory级别，通过同一个SqlSessionFactory创建的SqlSession查询结果会被缓存；
 * 此后若再次执行相同的查询语句，结果就会从缓存中获取
 * 二级缓存开启的条件：
 * 1.在核心配置文件中，设置全局配置属性cacheEnabled = "true",默认为true，不需要设置
 * 2.在映射文件中设置标签<cache/>
 * 3.二级缓存必须在sqlSession关闭或提交之后有效
 * 4.查询的数据所转换的实体类类型必须实现序列化接口
 * 使二级缓存失效的情况：
 * 两次查询期间执行了任意一次增删改操作，会使一级缓存和二级缓存同时失效
 * 三、MyBatis缓存查询的顺序
 * 1.二级缓存
 * 2.一级缓存
 * 3.数据库
 * SqlSession关闭后，一级缓存中的数据会写入二级缓存
 */
public interface CacheMapper {
    Employee getEmployeeById(@Param("employee_id") Integer id);
}
